﻿(function() {
	com.yogi.core.FlexPage = function( contentPanel ) {
		//页面整体包含的零件信息(页面需呈现零件表)
		var m_PartsConfig = [];
		//零件加载分组信息表，结构是[[idx0,idx1],[idx3],[idx2,idx5]] 各个组分开，其中idx是指在 m_partsConfig中的序号
		var m_loadGroups = [];
		//辅助表，从资源到零件配置信息的映射表
		var m_res_part_map = [];
		//辅助表，从零件ID到零件在m_PartsConfig数组中的索引号的映射表，用于快速寻找零件在页面中所处的层次
		var m_partid_seq_map = [];
		
		//===========工作表（需要反复清空和填充的表）=======================
		//页面需保留零件表，只记录ID
		var m_need_reserve_parts = [];
		//页面需加载零件表,由于用户导航的随意性，这个表是动态的
		var m_needload_parts = [];
		var wrapper_container_urls_count = 0;
		
		//一个引用
		var m_contentPanel;
		if(contentPanel) {
			m_contentPanel = contentPanel;
		}else{
			m_contentPanel = window.contentPanel; 
		}
		
		var json_loader = $.getJSON;
		var resources_loader = m_contentPanel.loadResources;
		var resources_getter = m_contentPanel.getResourceDirect;
		
		/**
		 * 初始化一个辅助查找表，键是资源url，值是零件配置信息
		 */
		function initRes_part_map() {
			m_res_part_map = new Array();
			if(m_PartsConfig != null){
				$.each(m_PartsConfig, function(index, configItem){
					m_res_part_map[configItem["PartFile"]] = configItem;
				});
			}
		}
		/**
		 * 构造 ”零件ID->页面层次序号映射表”
		 * 这个数据结构决定了零件在页面中的层次和显示，非常重要
		 */
		function make_partid_seq_map() {
			m_partid_seq_map = new Array();
			if(m_PartsConfig != null){
				$.each(m_PartsConfig, function(index,part_config){
					m_partid_seq_map[part_config.Id] = index;
				});
			}
		}
		/**
		 * 检查每个零件是否已经在零件ID查找表存在	
		 */
		function checkPartsExistency() {
			if(m_PartsConfig != null){
				$.each(m_PartsConfig, function(index,part_config){
					var partId = part_config["Id"];
					//检查每个零件是否已经在零件ID查找表存在
					if(!m_contentPanel.isPartLoaded(partId)){						
						//零件配置信息记入“页面需加载零件”表
						if(m_needload_parts == null){ 
							m_needload_parts = new Array(); 
						}
						if($.grep(m_needload_parts, function(elem,i) {
							return elem.Id == part_config.Id;
						}).length == 0){
							m_needload_parts.push(part_config);
						}
					}
				});
			}
		}
		
		/**
		 * 读取零件和分组信息，加载零件进入面板
		 * 参数的构成：
		 * 数组：[ [{零件一的信息},{零件二的信息}...],[[零件ID1,零件ID3],[零件ID2,零件ID5]...] ]
		 * 第一个维度是零件的配置信息，第二个维度是各个零件的加载分组信息，按加载顺序排序
		 */
		function parsePartsInfo(partsAndGroupConfig) {
			if(!$.isArray(partsAndGroupConfig)){
				throw "error catalog part config info";
			}
			//取得页面上需呈现的零件信息，页面做好簿记,置入“页面需呈现零件表”
			m_PartsConfig = partsAndGroupConfig[0];
			initRes_part_map();
			//加载分组信息记入“零件加载分组信息表”
			m_loadGroups = partsAndGroupConfig[1];
			//console.log(partsAndGroupConfig);
			
			//构造 ”零件ID->页面层次序号映射表”
			make_partid_seq_map();
				
			//下面开始检查每个零件是否已经在零件ID查找表存在					
			checkPartsExistency();
		}
		function doLoadParts() {
			if(m_needload_parts != null && m_needload_parts.length > 0){
				//清空除了那些需要保留以外的零件,以免计算过程导致到了99%的时候出现停顿
				m_contentPanel.clearScreen(_self);
				loadResourcesByGroup();
			}else{
				//全部不需要加载，则需要主动触发
				m_contentPanel.attachParts(_self, false);
			}
		}
		//按组信息加载资源 
		function loadResourcesByGroup() {
			if(m_loadGroups.length <= 0) return;
			var resIdxs = m_loadGroups.shift();		//把第一组索引拿出来，并消耗掉
			var res_urls = new Array();			
			$.each(resIdxs, function(i,resId){
				var res_map_part_id = m_PartsConfig[resId].Id;
				$.each( m_needload_parts, function(j, part_config){
					if(res_map_part_id == part_config.Id){
						var url = part_config["PartFile"];
						if(!Ext.isEmpty(url)){ res_urls.push(url); }
						return false;	
					}
				} );
			});
			if(res_urls.length > 0){		
				resources_loader(res_urls,onPartsResLoaded,_self);
			}else{
				if(m_loadGroups.length > 0){ 
					loadResourcesByGroup();		 	//递归
				}
			}
		}
		function onPartsResLoaded(resUrls) {
			$.each(resUrls, function(i, url){
				var partConfig = m_res_part_map[url];
				var newPart = new com.yogi.core.FlexPart(partConfig);
				newPart.initUI( resources_getter(url) );
				m_contentPanel.recordPart(newPart);
			});
			if(m_loadGroups.length > 0){
				loadResourcesByGroup();		//继续消耗加载组
			}
			m_contentPanel.attachParts(_self, false);		//加载完成
			if(typeof(console) != "undefined") console.log(m_contentPanel.objType);
			m_contentPanel.hideLoadingIcon();
		}
		/**
		 * 判断零件ID是否属于本页的 保留显示零件
		 */
		function inner_isPartReserved(partId) {
			if(m_need_reserve_parts != null && m_need_reserve_parts.length > 0){
				var find = m_need_reserve_parts.indexOf(partId) >= 0;
				return find;
			}
			return false;
		}
		function doLoadCatalogPage(catalog_config_url) {			
			json_loader(catalog_config_url,function(ret,textStatus){
				if(textStatus != "success") {
					throw "lack of catalog config info";
				}				
				var config = ret.data.Context;
				//alert(JSON.stringify(ret.Context));
				parsePartsInfo(config);
				//完成零件检查。检查未加载类的包装器，加载本页缺少的包装器类
				m_contentPanel.loadWrapperCls(m_needload_parts, _self);
			});
			return true;
		}
		function doClearWorkTable(){
			m_need_reserve_parts = new Array();
			m_needload_parts = new Array();
		}
		function doLoadDesignParts(page_id,parts_config){
			doClearWorkTable();	
			parsePartsInfo(parts_config);
			m_contentPanel.loadWrapperCls(m_needload_parts, _self);
		}
		var _self = {
			objType:"FlexPage interface",
			set_json_loader: function(loader){
				json_loader = loader;
			},
			load: function(catalog_config_url){
				return doLoadCatalogPage(catalog_config_url);
			},
			loadParts: function() {
				doLoadParts();
			},
			loadDesignParts: function(page_id, parts_config) {
				doLoadDesignParts(page_id,parts_config);
			},
			/**
			 * 清空“页面需链接(AddChildAt)零件表”和“页面需加载零件表”
			 */
			clearWorkTable: function() {
				doClearWorkTable();
			},
			getPartsConfig: function(){
				return m_PartsConfig;
			},		
			setReservePartConfig: function(configArray) {
				m_need_reserve_parts = configArray;			
			},
			isPartReserved: function(partId) {
				return inner_isPartReserved(partId);
			},
			test_func: function(func_name, args){
				eval("var inner_func = " + func_name);				
				if($.isFunction(inner_func)){
					//console.log(this.objType);
					return inner_func.apply(this,args);
				}
				return inner_func;
			},
			test_setter: function(lh,rh) {
				var stmt = lh + "=" + rh + ";";
				eval(stmt);
			}
		};
		return _self;
	}; 
	function dummy(){
		new com.yogi.core.FlexPage();
	}
	$(window).trigger(com.yogi.core.EVENT_EXTERNAL_SCRIPT_LOADED,  { script:"com.yogi.core.FlexPage" });
})();	